// 1. interface 只能定义引用数据类型，不能定义基本数据类型。而 type 都可以；

interface Person {
  name: string;
}

type Person1 = {
  name: string;
  age: number;
};

type Arr1 = Person1[];

type Fn = (x: number) => void;

type Numberable = number | undefined;

// 2. interface 定义对象类型不够灵活，type 都可以；
// 字符串字面量类型
type Keys = "name" | "age";

type Person2 = {
  [key in Keys]: any;
};
/*
  type Person1 = {
    name: any;
    age: any;
  };
*/

interface Person3 {
  // 不支持
  // [key in Keys]: any;
}

// 3. type 声明的类型不能重名，interface 声明的重命名会声明合并；
// type Person4 = {
//   name: string;
// };

// type Person4 = {
//   age: number;
// };

// 最终这两个类型会合并成一个类型
interface Person4 {
  name: string;
}
interface Person4 {
  age: number;
}

// 扩展window的类型
interface Window {
  xxx: any;
}

window.xxx = 111;

// 4. 两者继承的方法不同；
interface Person5 {
  name: string;
}
interface Person6 extends Person5 {
  age: number;
}

type Person7 = {
  name: string;
};
type Person8 = Person7 & { age: number }; // 交叉类型
